package cn.kgc.service.impl;

import cn.kgc.constants.Constants;
import cn.kgc.dto.UsersDto;
import cn.kgc.pojo.Users;
import cn.kgc.mapper.UsersMapper;
import cn.kgc.service.UsersService;
import cn.kgc.utils.UUIDUtils;
import cn.kgc.utils.UrlUtils;
import cn.kgc.utils.reids.RedisKeyUtils;
import cn.kgc.utils.reids.RedisUtils;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.Map;

/**
 * <p>
 * 用户 服务实现类
 * </p>
 *
 * @author psq
 * @since 2021-08-05
 */
@Service
public class UsersServiceImpl extends ServiceImpl<UsersMapper, Users> implements UsersService {

    private final UsersMapper usersMapper;
    private final RedisUtils redisUtils; // redis工具类

    public UsersServiceImpl(UsersMapper usersMapper, RedisUtils redisUtils) {
        this.usersMapper = usersMapper;
        this.redisUtils = redisUtils;
    }

    @Override
    public UsersDto loginWeChat(String access_token, String openid) {
        // 根据openid查询用户是否是第一次扫码
        UsersDto usersDto = usersMapper.getUsersDto(openid);
        // 如果结果为null，第一次扫码
        if (usersDto == null) {
            // 调用封装方法，根据openid获取用户信息
            Map<String, Object> map = this.getWechatUserInfo(access_token, openid);

            // 获取信息，并放入users对象
            if (map != null) {
                Users users = new Users();
                users.setOpenId(openid);
                if (map.get("nickname") != null) {
                    users.setUserName(map.get("nickname").toString());
                }
                if (map.get("sex") != null) {
                    users.setSex(Integer.parseInt(map.get("sex").toString()));
                }
                if (map.get("headimgurl") != null) {
                    users.setFaceUrl(map.get("headimgurl").toString());
                }
                // 将users对象存入数据库
                usersMapper.insert(users);
                // 存到redis，给前端的users对象应该是usersDto
                usersDto = new UsersDto(users);
            }
        }

        // 无论是不是第一次扫码都需要给token,并将usersDto存入redis
        setToken(usersDto);
        return usersDto;
    }

    @Override
    public UsersDto getLoginByToken(String token) {
        UsersDto usersDto = null;
        //1.判断redis中有没有这个token
        // 拼接前缀
        String key = RedisKeyUtils.formatKeyWithPrefix(Constants.Redis.PREFIX_TOKEN, token);
        // redis通过key，获取value
        String value = redisUtils.getValue(key);
        // 有，直接返回
        if (!StringUtils.isBlank(value)) {
            usersDto = JSON.parseObject(value, UsersDto.class);
        }
        // 没有，查询
        return usersDto;

    }

    public void setToken(UsersDto usersDto) {
        // 1.生成token
        String token = UUIDUtils.getUUID32();
        // 2.将token存入对象中
        usersDto.setToken(token);
        // 3.将这个对象存入redis中
        //String key = Constants.Redis.PREFIX_TOKEN + uuid;
            String key =RedisKeyUtils.formatKeyWithPrefix(Constants.Redis.PREFIX_TOKEN,token);

        // 4.将对象转成json
        String usersJson = JSON.toJSONString(usersDto);
        // 过期时间 Constants.Duration.HALF_AN_HOUR_INT 半小时
           //redisUtils.putValue(key,usersJson,Constants.Duration.HALF_AN_HOUR_INT);
        redisUtils.putValue(key, JSON.toJSONString(usersDto));
    }

    public Map<String, Object> getWechatUserInfo(String access_token, String openid) {
        Map<String, Object> map = new HashMap<>();
        // 从微信获取用户信息，第三次访问微信
        String url = "https://api.weixin.qq.com/sns/userinfo" +
                "?access_token=" + access_token +
                "&openid=" + openid;
        // 发送并获取结果
        String resultJson = UrlUtils.loadURL(url);
        // json转map
        map = JSON.parseObject(resultJson, Map.class);
        return map;
    }
}
